﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using app.Models;
using AmuTools;

namespace app.Api
{
    /*
        权限设置接口

        管理员角色可以随意添加，因为用的是同一套系统。管理员角色没有禁用权限
        一个管理员只有一个角色

        用户角色是固定的，添加角色没有意义。用户权限可以有禁用项（应该不会有额外授予权限的情况）
        一个用户可以有多个角色，每个角色可能对应不同的权限，用户角色越多，则能够使用的功能越多
        
        函数：
        @管理员角色列表
        @管理员角色增
        @管理员角色删
        @设置管理员角色权限
            参数：角色id，权限码数组

        // 用户角色没有增删
        @设置用户角色权限
            参数：角色id，权限码数组
        @添加用户禁用权限
            参数：用户id，权限码

        管理员角色表和用户角色表，因为字段不一样，所以放在不同的表里（原则上字段一样放同一张表，字段不同分开放）
    */
    public class ApiRole : ApiBase
    {
        public ApiRole(Controller ctx) : base(ctx) { }

        #region 自定义请求参数
        // 作者
        string req_permission { get { return GetStringParam(new ReqStringParamOption { Name = "permission" }); } }

        #endregion

        public void Do(string action)
        {
            AdminRole ar = null;

            switch (action)
            {
                case "admin_get":
                    ResponseJson(new ObjectResult { data = G.DB.GetById<AdminRole>(req_id) });
                    break;
                case "admin_add": {
                    CheckPermission(IDENTITY.ADMIN, Permission.Module(PERMISSIONMODULE.ADMIN_ROLE).Add());
                    ar = new AdminRole { name = req_name, permission = req_permission };
                    G.DB.Insert<AdminRole>(ar);
                    ResponseJson(new IDResult { id = ar.id });
                    } break;
                case "admin_delete":
                    CheckPermission(IDENTITY.ADMIN, Permission.Module(PERMISSIONMODULE.ADMIN_ROLE).Delete());
                    if (G.DB.Delete<AdminRole>(req_id) == 0) ThrowStatus(STATUS.FAILED_DELETE, "管理员角色删除失败");
                    else ResponseJson(new Result());
                    break;
                case "admin_modify":
                    CheckPermission(IDENTITY.ADMIN, Permission.Module(PERMISSIONMODULE.ADMIN_ROLE).Modify());
                    ar = G.DB.GetById<AdminRole>(req_id);
                    ar.name = req_name;
                    ar.permission = req_permission;
                    if (G.DB.Update<AdminRole>(ar) == 0) ThrowStatus(STATUS.FAILED_UPDATE, "管理员角色更新失败");
                    else ResponseJson(new Result());
                    break;
                case "member_get": break;
                // 用户基本权限设置
                case "member_base": break;

                // 专家权限设置
                case "member_expert": break;
                // 机构权限设置
                case "member_organization": break;
                // 企业权限设置
                case "member_enterprise": break;
                default: break;
            }
        }
    }


}











//// 检测是否有与权限码对应的权限，需要提供角色权限、用户权限、权限码作为参数
//static public bool Check(string role_permission, string user_permission, string code)
//{
//    string module_code = code.Substring(0, 4);
//    string operation_code = code.Substring(4);
//    Regex r;
//    Match m;

//    // 检测是否为超级管理员
//    if (role_permission == "+100010") return true;

//    // 检测用户权限
//    // 用户附加权限检测
//    r = new Regex(string.Format(@"\+{0}\d+", module_code));
//    m = r.Match(user_permission);
//    if (m.Value != "") return CheckOperationCode(m.Value.Substring(5), operation_code);
//    // 用户禁用权限检测
//    r = new Regex(string.Format(@"\-{0}\d+", module_code));
//    m = r.Match(user_permission);
//    if (m.Value != "") return !CheckOperationCode(m.Value.Substring(5), operation_code);

//    // 检测角色权限
//    r = new Regex(string.Format(@"\+{0}\d+", module_code));
//    m = r.Match(role_permission);
//    if (m.Value != "") return CheckOperationCode(m.Value.Substring(5), operation_code);

//    return false;
//}
//static private bool CheckOperationCode(string operation_codes, string operation_code)
//{
//    if (operation_code.Length != 2) throw new Exception("操作码错误:" + operation_code);
//    if (operation_codes.Length % 2 != 0) throw new Exception("操作码组错误:" + operation_codes);

//    // 如果前两位为10代表所有权限，返回true
//    if (operation_codes[0] == '1' && operation_codes[1] == '0')
//    {
//        return true;
//    }

//    int index = 0;
//    int len = operation_codes.Length;
//    while (index < len)
//    {
//        if (operation_code[0] == operation_codes[index] && operation_code[1] == operation_codes[index + 1])
//        {
//            return true;
//        }
//        else
//        {
//            index += 2;
//        }
//    }
//    return false;
//}

//// 将权限码添加到权限中，返回新的权限
//static public string Add(string premission, string code)
//{
//    string module_code = code.Substring(0, 4);
//    string operation_code = code.Substring(4);
//    Regex r;
//    Match m;

//    // 如果为1000权限，不需要操作
//    //if (premission == "+100010") return premission;

//    // 从-XXXX中删除权限

//    // 向+XXXX中添加权限

//    // 如果为+XXXX10权限，不需要操作，否则向+XXXX中添加权限
//    r = new Regex(string.Format(@"\+{0}\d+", module_code));
//    m = r.Match(premission);
//    if (m.Value != "")
//    {
//        if (m.Value.Substring(5) == "10") return premission;
//        return CheckOperationCode(m.Value.Substring(5), operation_code);
//    }
//    return "";
//}
//static private string AddOperationCode(string operation_codes, string operation_code)
//{
//    if (operation_code.Length != 2) throw new Exception("操作码错误:" + operation_code);
//    if (operation_codes.Length % 2 != 0) throw new Exception("操作码组错误:" + operation_codes);

//    // 如果已经存在这个权限，则不需要操作直接返回，如果没有，将权限附加到最后
//    int index = 0;
//    int len = operation_codes.Length;
//    while (index < len)
//    {
//        if (operation_code[0] == operation_codes[index] && operation_code[1] == operation_codes[index + 1])
//        {
//            return operation_codes;
//        }
//        else
//        {
//            index += 2;
//        }
//    }
//    return operation_codes + operation_code;
//}
//static private string DeleteOperationCode(string operation_codes, string operation_code)
//{
//    if (operation_code.Length != 2) throw new Exception("操作码错误:" + operation_code);
//    if (operation_codes.Length % 2 != 0) throw new Exception("操作码组错误:" + operation_codes);

//    // 如果已经存在这个权限，则删除，没有则返回原来的值
//    int index = 0;
//    int len = operation_codes.Length;
//    while (index < len)
//    {
//        if (operation_code[0] == operation_codes[index] && operation_code[1] == operation_codes[index + 1])
//        {
//            return operation_codes.Substring(0, index) + (index + 2 < len ? operation_codes.Substring(index + 2) : "");
//        }
//        else
//        {
//            index += 2;
//        }
//    }
//    return operation_codes;
//}

//// 禁用某个权限，返回新的权限
//static public string Forbidden(string premission, string code, bool value)
//{
//    return "";
//}

//// 从权限中删除权限码对应权限，返回新的权限
//static public string Delete(string premission, string code)
//{
//    return "";
//}